/**
********************************************************************************
\file   demo-sn-gpio/boot/handshake.c

\defgroup module_sn_boot_hands_com Handshake common module
\{

\brief  Handshake common module

This module implements the common functions of the handshake for uP-Master and
uP-Slave.

\ingroup group_app_sn_boot
*******************************************************************************/

/*------------------------------------------------------------------------------
* License Agreement
*
* Copyright (c) 2014, B&R Industrial Automation GmbH
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification,
* are permitted provided that the following conditions are met:
*
*   * Redistributions of source code must retain the above copyright notice,
*     this list of conditions and the following disclaimer.
*   * Redistributions in binary form must reproduce the above copyright notice,
*     this list of conditions and the following disclaimer
*     in the documentation and/or other materials provided with the
*     distribution.
*   * Neither the name of the B&R nor the names of its contributors
*     may be used to endorse or promote products derived from this software
*     without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
------------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*/
/* includes                                                                   */
/*----------------------------------------------------------------------------*/
#include <boot/internal/handshake.h>

/*============================================================================*/
/*            G L O B A L   D E F I N I T I O N S                             */
/*============================================================================*/

/*----------------------------------------------------------------------------*/
/* const defines                                                              */
/*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*/
/* module global vars                                                         */
/*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*/
/* global function prototypes                                                 */
/*----------------------------------------------------------------------------*/


/*============================================================================*/
/*            P R I V A T E   D E F I N I T I O N S                           */
/*============================================================================*/

/*----------------------------------------------------------------------------*/
/* const defines                                                              */
/*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*/
/* local types                                                                */
/*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*/
/* local vars                                                                 */
/*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*/
/* local function prototypes                                                  */
/*----------------------------------------------------------------------------*/

/*============================================================================*/
/*            P U B L I C   F U N C T I O N S                                 */
/*============================================================================*/


/*----------------------------------------------------------------------------*/
/**
\brief    Verify the SN state field

\param[in]    snState_p        The value of the state field
\param[inout] pRestoreSod_p    Pointer to the SOD restore flag
*/
/*----------------------------------------------------------------------------*/
void hands_verifySnStateField(UINT16 snState_p, BOOLEAN * pRestoreSod_p)
{
    if(pRestoreSod_p != NULL)
    {
        if((snState_p & (1<<RESTORE_SOD_STATE_BIT)) == 0 &&
            *pRestoreSod_p == TRUE                        )
        {
            /* There is a local image available but there is no remote image */
            *pRestoreSod_p = FALSE;
        }
        else if((snState_p & (1<<RESTORE_SOD_STATE_BIT)) != 0 &&
                *pRestoreSod_p == FALSE                        )
        {
            /* There is no local image available but there is a remote image */
            *pRestoreSod_p = FALSE;
        }
    }
    else
    {
        errh_postFatalError(kErrSourcePeriph, kErrorInvalidParameter, 0);
    }
}

/*----------------------------------------------------------------------------*/
/**
\brief    Fill the SN state field

\param[out]   pSnState_p       Pointer to the SN state field
\param[inout] pRestoreSod_p    Pointer to the SOD restore flag
*/
/*----------------------------------------------------------------------------*/
void hands_fillStateField(volatile UINT16* pSnState_p, BOOLEAN * pRestoreSod_p)
{
    if(pSnState_p != NULL && pRestoreSod_p != NULL)
    {
        if(*pRestoreSod_p == TRUE)
        {
            *pSnState_p |= (1<<RESTORE_SOD_STATE_BIT);
        }
        else
        {
            *pSnState_p &= ~(1<<RESTORE_SOD_STATE_BIT);
        }
    }
    else
    {
        errh_postFatalError(kErrSourcePeriph, kErrorInvalidParameter, 0);
    }
}

/*============================================================================*/
/*            P R I V A T E   F U N C T I O N S                               */
/*============================================================================*/
/** \name Private Functions */
/** \{ */

/**
 * \}
 * \}
 */
